package com.wlc.collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description ArrayList集合
 * @date 2021-07-11 14:10
 */
public class ArrayListDemo {
    /**
     * 数组
     */
    public void method01() {
        Hero[] heroes = new Hero[10];
        heroes[8] = new Hero("盖伦", 20);
        heroes[9] = new Hero("盖伦1", 20);
        System.out.println("heroes[8].name = " + heroes[8].name);
        System.out.println("heroes[9].name = " + heroes[9].name);
    }

    /**
     * 容器类 ，常见的容器类就是ArrayList
     */
    public void method02() {
        ArrayList<Hero> heroes = new ArrayList<>();
        heroes.add(new Hero("盖伦1", 21));
        heroes.add(new Hero("盖伦2", 22));
        heroes.add(new Hero("盖伦3", 23));
        heroes.add(new Hero("盖伦4", 24));
        heroes.add(new Hero("盖伦5", 25));
        heroes.add(new Hero("盖伦6", 26));
        heroes.add(new Hero("盖伦7", 27));
        System.out.println("heroes.size() = " + heroes.size());

    }

    /**
     * 集合常见的方法
     */
    public void method03() {
        // 1、add 添加
        ArrayList<Hero> heroes = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            heroes.add(new Hero("张三" + i, i));
        }
        loopList(heroes);
        // 2、在指定的索引处添加
        heroes.add(3, new Hero("小米姑娘", 2));
        loopList(heroes);
        // 3、判断对象是否存在
        Hero myHero = new Hero("张桂芳", 20);
        heroes.add(myHero);
        // 结果 为true
        System.out.println("heroes.contains(myHero) = " + heroes.contains(myHero));
        // 4、获取指定位置的对象 get(index)
        System.out.println("heroes.get(6) = " + heroes.get(6));
        // 超过数组长度，会提示数组下标越界异常
        System.out.println("heroes.get(7) = " + heroes.get(6));
        // 5、判断一个对象在集合中的位置
        System.out.println("heroes.indexOf(myHero) = " + heroes.indexOf(myHero));
        // 6、从集合中删除元素 ;可以使用remove(下标)  或者remove(对象）
        loopList(heroes);
        heroes.remove(0);
        loopList(heroes);
        heroes.remove(myHero);
        loopList(heroes);
        // 7 、替换 set(index,Object)  把指定索引处的元素替换为新的对象Object
        heroes.set(2, new Hero("西瓜姑娘", 34));
        loopList(heroes);
        // 8、 获取集合的长度
        System.out.println("heroes.size() = " + heroes.size());
        // 9、 集合转换为数组
        Hero[] heroes1 = heroes.toArray(new Hero[]{});
        Arrays.stream(heroes1).forEach(System.out::println);
        System.out.println("===============");
        // 定义一个对象数组
        Hero[] heroes2 = {null, null};
        heroes2[0] = new Hero("asdf", 20);
        System.out.println("heroes2.length = " + heroes2.length);
        // 10、addAll() 添加所有元素
        ArrayList<Hero> heroes3 = new ArrayList<>();
        heroes3.add(new Hero("aaa", 2));
        heroes3.add(new Hero("bbb", 2));
        heroes.addAll(heroes3);
        loopList(heroes);
        // 11、清空一个集合
        heroes.clear();
        loopList(heroes);
    }

    /**
     * 遍历集合
     *
     * @param tList
     */
    private static void loopList(List<?> tList) {
        tList.stream().forEach(System.out::println);
        System.out.println("============");
    }

    /**
     * 范型
     */
    public void method04() {
        // 不指定范型的容器List 可以放 Hero对象；也可以放Item对象
        List list = new ArrayList();
        list.add(new Hero("盖伦", 2000));
        list.add(new Item("水瓶", 200));
        list.forEach(System.out::println);

        Hero hero = (Hero) list.get(0);
        System.out.println("hero.name = " + hero.name);
        System.out.println("hero.hp = " + hero.hp);

        Item item = (Item) list.get(0);
        System.out.println("item.name = " + item.name);
        System.out.println("item.price = " + item.price);

        List<Hero> heroes = new ArrayList<>();
        heroes.add(new Hero("小米姑娘", 20));

        Hero hero1 = heroes.get(0);
    }

    /**
     * 定义范型，支持 Hero对象和Item 对象
     */
    public void method05() {
        List<Aod> aods = new ArrayList<>();
        aods.add(new Hero("李白", 1000));
        aods.add(new Item("药水", 300));
        // 只能放入 指定类型和子类；放入其他类一样报错！
        //aods.add(new ArrayListDemo());
        aods.forEach(System.out::println);
        Hero hero = (Hero) aods.get(0);
        Item item = (Item) aods.get(1);
        System.out.println("item 为： " + item + "  hero为： " + hero);
    }

    /**
     * 遍历集合的几种方式
     */
    public void method06() {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        // 1、使用for循环遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println("list.get(i) = " + list.get(i));
        }
        System.out.println("-=========-");
        // 2、使用增强for循环
        for (Object list1 : list) {
            System.out.println("list1 = " + list1);
        }
        // 3、使用迭代器循环
        Iterator iterator = list.iterator();
        while (true) {
            if (!iterator.hasNext()) {
                break;
            }
            Object next = iterator.next();
            System.out.println("迭代器迭代的结果： " + next);

        }
        // 4、for循环的迭代其
        for (Iterator iterator2 = list.iterator(); iterator2.hasNext(); ) {
            Object next = iterator2.next();
            System.out.println("for迭代器的方式 = " + next);
        }
        // 5、使用 list.stream() 流的forEach lambda 表达式
        list.stream().forEach(System.out::println);

    }

    /**
     * 循环创建100个对象；把对象名称是8的倍数的对象移除；重新打印结果展示
     */
    public void method07() {
        // 循环100个 对象，编号1-100； 把8的倍数删除；
        List<Hero> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add(new Hero("hero" + i, i));
        }
        for (int i = 0; i < list.size(); i++) {
            int number = Integer.parseInt(list.get(i).getName().substring(4));
            if (number % 8 == 0) {
                list.remove(list.get(i));
            }
        }
        System.out.println("删除后的结果为：");
        list.forEach(System.out::println);


    }


    public static void main(String[] args) {
        ArrayListDemo arrayListDemo = new ArrayListDemo();
        arrayListDemo.method07();
    }

    interface Aod {

    }

    class Hero implements Aod {
        private String name;
        private float hp;

        public Hero() {
        }

        public Hero(String name, float hp) {
            this.name = name;
            this.hp = hp;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public float getHp() {
            return hp;
        }

        public void setHp(float hp) {
            this.hp = hp;
        }

        @Override
        public String toString() {
            return "Hero对象{" +
                    "name姓名为='" + name + '\'' +
                    ", hp 血量为=" + hp +
                    '}';
        }
    }

    class Item implements Aod {
        private String name;
        private int price;

        @Override
        public String toString() {
            return "Item{" +
                    "name='" + name + '\'' +
                    ", price='" + price + '\'' +
                    '}';
        }

        public Item() {
        }

        public Item(String name, int price) {
            this.name = name;
            this.price = price;
        }
    }
}











